Créer une autorité de certification racine (Root CA) avec OpenSSL
Si vous avez un serveur Linux ou un VPS (machine virtuelle sur Internet) et que vous souhaitez sécuriser plusieurs services (web, mails, ...), il devient très intéressant d'utiliser une autorité de certification. Grâce à cette autorité de certification, il vous suffira d'importer le certificat de votre autorité de certification dans les autorités de confiance de vos périphériques (ordinateurs, smartphones, ...) pour que tous vos certificats soient considérés comme émanant d'une autorité reconnue.
Sommaire
2. Création de l'autorité de certification (CA)
3. Création d'une demande de signature de certificat
4. Création du certificat depuis la demande de signature
5. Sécuriser Apache avec le certificat SSL
7. Importer le certificat de l'autorité dans les PC Linux
8. Importer le certificat de l'autorité dans les PC Windows
10. Création de la liste de révocation (CRL)
11. Rendre la liste de révocation accessible depuis le web
Par sécurité, faites une mise à jour de la liste des paquets.
apt-get update
Puis, installez le paquet "openssl".
apt-get install openssl
Pour modifiez les informations qu'OpenSSL utilisera pour créer l'autorité de certification, modifiez le fichier "/etc/ssl/openssl.cnf".
Dans ce fichier, vous pourrez modifiez la durée de validité des certificats que vous signerez.
Par exemple : 10 ans (3650 jours).
default_days = 3650
Modifier la taille de la clé utilisée. Pour information : Geotrust demande maintenant des certificats en 2048 bits. Donc, autant faire comme eux.
default_bits = 2048
Ainsi, que les informations de votre autorité de certification. Dont celles-ci :
# Le code du pays.
countryName_default = BE
# L'état ou la province. Perso, j'ai mis le pays pour protéger ma vie privée.
stateOrProvinceName_default = Belgique
# Le nom de votre organisation (ou le nom de votre site si vous le souhaitez).
0.organizationName_default = InformatiWeb
# Dans la partie "[ usr_cert ]", ajoutez la ligne suivante :
crlDistributionPoints=URI:http://www.informatiweblan.net/ca-crl.crl
# Doc : https://www.openssl.org/docs/apps/x509v3_config.html#crl_distribution_points_
Pour finir, créer votre autorité de certification en utilisant le script "CA.sh" d'OpenSSL.
cd /usr/lib/ssl/misc/
sudo ./CA.sh -newca
Lors de la création de l'autorité de certification, le script vous demandera :
- un mot de passe pour protéger la clé privée de l'autorité de certification
- les informations à indiquer dans le certificat de l'autorité
Note : Le nom commun a indiquer lors de la création de l'autorité de certification est le nom de votre autorité de certification.
...
writing new private key to './demoCA/private/./cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
...
Country Name (2 letter code) [BE]:
State or Province Name (full name) [Belgique]:
Locality Name (eg, city) []:
Organization Name (eg, company) [InformatiWeb]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:InformatiWeb CA
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
…
Dans le dossier "/usr/lib/ssl/misc/demoCA" qui a été créé par ce script, vous trouverez tous les fichiers concernant votre autorité de certification.
Dont le certificat de l'autorité : "cacert.pem".
ls -l /usr/lib/ssl/misc/demoCA/
total 40
-rw-r--r-- 1 root root 4309 fév 11 16:14 cacert.pem
-rw-r--r-- 1 root root 972 fév 11 16:14 careq.pem
drwxr-xr-x 2 root root 4096 fév 11 16:14 certs
drwxr-xr-x 2 root root 4096 fév 11 16:14 crl
-rw-r--r-- 1 root root 94 fév 11 16:14 index.txt
-rw-r--r-- 1 root root 21 fév 11 16:14 index.txt.attr
-rw-r--r-- 1 root root 0 fév 11 16:14 index.txt.old
drwxr-xr-x 2 root root 4096 fév 11 16:14 newcerts
drwxr-xr-x 2 root root 4096 fév 11 16:14 private
-rw-r--r-- 1 root root 17 fév 11 16:14 serial
Pour prendre un exemple courant, nous allons demander un certificat qui aura ces caractéristiques :
- valable 10 ans
- valide pour tous les sous-domaines (sauf le domaine)
- clé privée non protégée par mot de passe pour éviter qu'Apache ne le demande au démarrage (ou redémarrage en cas de problèmes)
openssl req -new -nodes -keyout /etc/ssl/private/www-key.pem -out /tmp/www-req.pem -days 3650
Comme tout à l'heure, des informations vous seront demandées.
Parmi ces informations, vous devez obligatoirement indiquer "*.domaine.net" pour le nom commun car c'est cette valeur que le navigateur web vérifiera.
Note : Pour générer un certificat valable pour le domaine uniquement, indiquez "domaine.net" pour le nom commun.
Generating a 2048 bit RSA private key
............+++
..........+++
writing new private key to 'www-key.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [BE]:
State or Province Name (full name) [Belgique]:
Locality Name (eg, city) []:
Organization Name (eg, company) [InformatiWeb]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:*.informatiweblan.net
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Pour finir, utilisez la demande de signature pour signer le certificat.
cd /usr/lib/ssl/misc/
openssl ca -out /etc/ssl/certs/www-cert.pem -infiles /tmp/www-req.pem
Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number:
92:41:c8:a0:fa:43:33:f6
Validity
Not Before: Feb 11 15:30:52 2015 GMT
Not After : Feb 8 15:30:52 2025 GMT
Subject:
countryName = BE
stateOrProvinceName = Belgique
organizationName = InformatiWeb
commonName = *.informatiweblan.net
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
9E:24:79:43:C8:90:6E:9E:52:4A:80:8C:35:32:92:AC:66:CD:20:F6
X509v3 Authority Key Identifier:
keyid:10:44:64:86:EB:FE:F1:52:10:8A:0B:EF:2C:49:EE:DC:F0:1C:B3:2F
Certificate is to be certified until Feb 8 15:30:52 2025 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
Dans la configuration d'un site sécurisé avec SSL, vous indiquerez les lignes suivantes :
SSLEngine on
SSLCertificateFile /etc/ssl/certs/www-cert.pem
SSLCertificateKeyFile /etc/ssl/private/www-key.pem
Pour plus d'informations sur la sécurisation d'un serveur web Apache, lisez notre tutoriel "Sécurisation du serveur web Apache".
Si vous tentez d'accéder à la partie sécurisée de votre site via le protocole https, vous aurez un avertissement "Cette connexion n'est pas certifiée".
Ce qui est tout à fait normal étant donné que notre autorité de certification n'est pas reconnue par défaut. Pour établir cette confiance, l'utilisateur doit ajouter le certificat de votre autorité dans la liste des autorités de certification de confiance de son ordinateur (ou smartphone, ...).
Pour les PC Linux, pas de problème. Il suffit de copier le certificat de l'autorité (uniquement le certificat) dans l'espace web de votre serveur.
cp /usr/lib/ssl/misc/demoCA/cacert.pem /var/www/
Ensuite, sur les pc clients, accédez à l'adresse : http://www.informatiweblan.net/cacert.pem
Note : Il faut utiliser le protocole http pour télécharger le certificat car la version https est bloquée par l'avertissement.
Le navigateur web vous demandera de confirmer cette nouvelle autorité.
Si utilisez des certificats uniquement pour vos sites web, cochez uniquement la première case.
Sinon, cochez aussi les autres cases si besoin (pour les protocoles imap et pop3 de votre serveur de messagerie, par exemple).
Le navigateur web n'affichera plus d'avertissement pour les certificats que vous signerez avec votre autorité de certification.
Pour les PC Windows, vous devez convertir le certificat .pem en .cer (format microsoft).
Pour cela, faites la conversion sur le serveur grâce à "OpenSSL".
cd /usr/lib/ssl/misc/demoCA
openssl x509 -inform PEM -in cacert.pem -outform DER -out cacert.cer
Puis, copiez cette version du certificat dans l'espace web de votre serveur.
cp /usr/lib/ssl/misc/demoCA/cacert.cer /var/www/
Ensuite, sur les pc clients, téléchargez le certificat de votre autorité de certification à l'adresse : http://www.informatiweblan.net/cacert.cer
Note : Il faut utiliser le protocole http pour télécharger le certificat car la version https est bloquée par l'avertissement.
Ouvrez le certificat et cliquez sur "Installer le certificat".
Cliquez sur "Parcourir" et sélectionnez le magasin "Autorités de certification racines de confiances".
Confirmez l'importation du certificat de votre autorité de certification en cliquant sur "Oui".
Les navigateurs web "Internet Explorer" et "Google Chrome" utilisent le magasin de certificats de Windows. Vous n'aurez donc plus d'avertissement pour vos certificats sur ces navigateurs web.
Pour Mozilla Firefox, ouvrez ce navigateur et allez dans le menu (les 3 lignes horizontales) -> Options -> Avancé -> Certificats -> Afficher les certificats -> Autorités.
Ensuite, cliquez sur le bouton "Importer" et sélectionnez le certificat de votre autorité.
Le navigateur web vous demandera de confirmer cette nouvelle autorité.
Si utilisez des certificats uniquement pour vos sites web, cochez uniquement la première case.
Sinon, cochez aussi les autres cases si besoin (pour les protocoles imap et pop3 de votre serveur de messagerie, par exemple).
Maintenant, Mozilla Firefox n'affichera plus d'avertissements pour les certificats signés par votre autorité.
Pour finir ce tutoriel sur la création et l'utilisation d'une autorité de certification sous Linux, voici comment révoquer un certificat.
En d'autres termes : rendre un certificat invalide pour une raison ou pour une autre.
cd /usr/lib/ssl/misc
openssl ca -revoke /etc/ssl/certs/www-cert.pem
Note : OpenSSL vous demandera le mot de passe de la clé privée de l'autorité pour révoquer le certificat souhaité.
Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Revoking Certificate 9241C8A0FA4333F6.
Data Base Updated
Créez le fichier "crlnumber".
echo 1000 > /usr/lib/ssl/misc/demoCA/crlnumber
Puis, créer la liste de révocation (CRL)
cd /usr/lib/ssl/misc
openssl ca -gencrl -out demoCA/crl/ca-crl.pem
Conformément à la norme "RFC 5280", la liste de révocation doit être encodée en DER :
Extrait :
If the DistributionPointName contains a general name of type URI, the following semantics MUST be assumed: the URI is a pointer to the current CRL for the associated reasons and will be issued by the associated cRLIssuer. When the HTTP or FTP URI scheme is used, the URI MUST point to a single DER encoded CRL as specified in [RFC2585].
Pour encoder cette liste au format DER, utilisez OpenSSL comme ceci :
openssl crl -inform PEM -in demoCA/crl/ca-crl.pem -outform DER -out demoCA/crl/ca-crl.crl
Pour cela, copiez ce fichier "ca-crl.crl" dans l'espace web de votre serveur.
cp /usr/lib/ssl/misc/demoCA/crl/ca-crl.crl /var/www/ca-crl.crl
Pour éviter que le cache ne pose problème pour ce test, nous allons vider le cache des listes de révocation de Windows.
Cela vous évitera d'avoir un certificat révoqué non reconnu comme révoqué.
Pour cela, tapez ces 2 commandes dans un "invite de commandes" lancé en tant qu'administrateur.
Vide le cache de CRL (les listes de révocations de certificats) du disque dur :
certutil -URLCache CRL –delete
Invalide l'utilisation des CRL en cache dans la mémoire et sur le disque dur :
certutil –setreg chain\ChainCacheResyncFiletime @now
Et enfin, videz le cache de votre navigateur. Ainsi, la révocation sera prise en compte directement.
Après 2-3 minutes, Internet Explorer ainsi que les autres navigateurs vont bloquer l'accès à votre site car le certificat a été révoqué.
Voici l'erreur sous Internet Explorer.